From: Florian Müllner Date: Sun, 23 Sep 2018 01:06:21 +0000 (+0200) Subject: osdWindow: Disconnect signals on destroy X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~897^2~1^2~74 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=8566ec2ee5a793715b2a1def8dcf83787bc857b6;p=gnome-shell.git osdWindow: Disconnect signals on destroy Since we started to show OSD windows on all monitors, OSD windows are destroyed when the corresponding monitor is disconnected. We shouldn't leave any signal handlers around in that case - they prevent the object from being garbage collected, and trigger warnings for accessing proper- ties of invalidated GObjects. https://gitlab.gnome.org/GNOME/gnome-shell/issues/602 --- diff --git a/js/ui/osdWindow.js b/js/ui/osdWindow.js index fb6587be0..d7077a063 100644 --- a/js/ui/osdWindow.js +++ b/js/ui/osdWindow.js @@ -118,15 +118,30 @@ var OsdWindow = new Lang.Class({ this._hideTimeoutId = 0; this._reset(); - Main.layoutManager.connect('monitors-changed', - this._relayout.bind(this)); + this.actor.connect('destroy', this._onDestroy.bind(this)); + + this._monitorsChangedId = + Main.layoutManager.connect('monitors-changed', + this._relayout.bind(this)); let themeContext = St.ThemeContext.get_for_stage(global.stage); - themeContext.connect('notify::scale-factor', - this._relayout.bind(this)); + this._scaleChangedId = + themeContext.connect('notify::scale-factor', + this._relayout.bind(this)); this._relayout(); Main.uiGroup.add_child(this.actor); }, + _onDestroy() { + if (this._monitorsChangedId) + Main.layoutManager.disconnect(this._monitorsChangedId); + this._monitorsChangedId = 0; + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + if (this._scaleChangedId) + themeContext.disconnect(this._scaleChangedId); + this._scaleChangedId = 0; + }, + setIcon(icon) { this._icon.gicon = icon; },